package com.ketaichan.zolon_printer.utils;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.text.Layout;
import android.text.StaticLayout;
import android.text.TextPaint;

public class DrawUtils {

    private static float ticketSize(float size) {
        return size * 22 / 16;
    }

    /**
     * 使用 StaticLayout 计算文本高度
     *
     * @param text     要绘制的文本
     * @param maxWidth 最大宽度
     * @param textSize 字体大小
     * @param bold     是否加粗
     * @return 文本的总高度
     */
    public static int calculateTextHeight(String text, float maxWidth, float textSize, boolean bold) {
        TextPaint textPaint = new TextPaint();
        textPaint.setTextSize(DrawUtils.ticketSize(textSize));
        textPaint.setFakeBoldText(bold);
        StaticLayout staticLayout = new StaticLayout(
                text,                    // 文本内容
                textPaint,               // 文本样式
                (int) maxWidth,          // 最大宽度
                Layout.Alignment.ALIGN_NORMAL, // 对齐方式
                1.0f,                    // 行间距倍数
                0.0f,                    // 行间距附加像素
                false                    // 是否包含段落间额外间距
        );

        return staticLayout.getHeight(); // 获取总高度
    }

    /**
     * 使用 StaticLayout 计算文本宽度
     *
     * @param text     要绘制的文本
     * @param maxWidth 最大宽度
     * @param textSize 字体大小
     * @param bold     是否加粗
     * @return 文本的总高度
     */
    public static int calculateTextWidth(String text, float maxWidth, float textSize, boolean bold) {
        TextPaint textPaint = new TextPaint();
        textPaint.setTextSize(DrawUtils.ticketSize(textSize));
        textPaint.setFakeBoldText(bold);
        StaticLayout staticLayout = new StaticLayout(
                text,                    // 文本内容
                textPaint,               // 文本样式
                (int) maxWidth,          // 最大宽度
                Layout.Alignment.ALIGN_NORMAL, // 对齐方式
                1.0f,                    // 行间距倍数
                0.0f,                    // 行间距附加像素
                false                    // 是否包含段落间额外间距
        );

        float maxLineWidth = 0;
        for (int i = 0; i < staticLayout.getLineCount(); i++) {
            maxLineWidth = Math.max(maxLineWidth, staticLayout.getLineWidth(i));
        }

        return (int) maxLineWidth;
    }

    /**
     * 使用 StaticLayout 绘制多行文本
     *
     * @param canvas   Canvas 对象
     * @param text     要绘制的文本
     * @param x        起始 x 坐标
     * @param y        起始 y 坐标
     * @param maxWidth 文本的最大宽度
     * @param textSize 字体大小
     * @param bold     是否加粗
     */
    public static void drawTextWithStaticLayout(Canvas canvas, String text, float x, float y, float maxWidth, float textSize, boolean bold, Layout.Alignment alignment) {
        TextPaint textPaint = new TextPaint();
        textPaint.setTextSize(DrawUtils.ticketSize(textSize));
        textPaint.setFakeBoldText(bold);
        // 创建 StaticLayout
        StaticLayout staticLayout = new StaticLayout(
                text,               // 要绘制的文本
                textPaint,              // TextPaint 对象
                (int) maxWidth,     // 最大宽度
                alignment, // 对齐方式
                1.0f,               // 行间距倍数
                0.0f,               // 行间距附加像素
                false               // 是否包含额外的段落间距
        );

        // 保存和偏移 Canvas
        canvas.save();
        canvas.translate(x, y); // 将 Canvas 的原点移动到指定位置

        // 绘制文本
        staticLayout.draw(canvas);

        // 恢复 Canvas
        canvas.restore();
    }

    /**
     * 在 Canvas 上绘制虚线
     *
     * @param canvas    Canvas 对象
     * @param startX    起点 x 坐标
     * @param startY    起点 y 坐标
     * @param stopX     终点 x 坐标
     * @param stopY     终点 y 坐标
     * @param strokeWidth 虚线宽度
     * @param dashLength 虚线段长度
     * @param spaceLength 虚线间隔长度
     */
    public static void drawDashedLine(Canvas canvas, float startX, float startY, float stopX, float stopY,
                                      float strokeWidth, float dashLength, float spaceLength) {
        // 创建 Paint
        Paint paint = new Paint();
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(strokeWidth);
        paint.setAntiAlias(true);

        // 设置虚线效果
        DashPathEffect dashPathEffect = new DashPathEffect(new float[]{dashLength, spaceLength}, 0);
        paint.setPathEffect(dashPathEffect);

        // 绘制线条
        canvas.drawLine(startX, startY, stopX, stopY, paint);
    }
}